/**
 * 寄生组合式继承就是为了降低调用父类构造函数的开销而出现的 
 * 不必为了指定子类型的原型而调用超类型的构造函数
 * 
 * 寄生组合继承 两个函数之间进行继承
 * 其实涵盖了寄生 和 组合
 * 寄生 --- 抽离继承逻辑
 * 组合 --- 创建一个寄生 父类 返回后的 父类 实例对象 
 *              => 该对象原型上指向 Father 
 *          将其对象的构造函数指向孩子Son   增强对象
 *              => 由于最后是要让孩子继承父类
 *              => 此时我们还未对孩子进行操作
 *          将孩子的原型指向 之前的那个增强对象
*/

function objectCopy(obj) {
  function Fun() { };
  Fun.prototype = obj;
  return new Fun();
}

function inheritPrototype(child, parent) { // 单独创建一个方法用于实现继承的效果
  let prototype = objectCopy(parent.prototype); // 创建对象
  console.log("1",prototype)
  prototype.constructor = child; // 增强对象
  console.log("2",prototype)
  child.prototype = prototype; // 赋值对象
  console.log("3",child)
}

function Father() {
  this.name = "abc"
}
Father.say = function () {
  console.log(this.name)
}
function Son() {
  Father.call(this);
  this.age = 12
}

var a = new Son()
var b = new Father()
inheritPrototype(Son, Father)
let m = new Son()
console.log(m)